package com.shekhargulati.ninetynine_problems._03_logic_and_codes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
/**
* (**) Gray code.
* An n-bit Gray code is a sequence of n-bit strings constructed according to certain rules. For example,
* n = 1: C(1) = ['0','1'].
* n = 2: C(2) = ['00','01','11','10'].
* n = 3: C(3) = ['000','001','011','010','110','111','101','100'].
*/
public class P49 {
public static List<String> gray(int n) {
if (n == 1) {
return Arrays.asList("0", "1");
}
List<String> original = gray(n - 1);
List<String> reversed = new ArrayList<>(original);
Collections.reverse(reversed);
return Stream.concat(original.stream().map(s -> "0" + s), reversed.stream().map(s -> "1" + s)).collect(toList());
}
}